home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 50
/
Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso
/
Aminet
/
util
/
wb
/
BWS_Scalos.lha
/
BWS_Scalos
/
amigaini
/
amigaini.library.e
< prev
next >
Wrap
Text File
|
2001-12-05
|
13KB
|
646 lines
OPT PREPROCESS
OPT STACK=32000
LIBRARY 'amigaini.library',
6,02,
'$VER: amigaini.library 6.02b (26.11.2001) INI lib for AmigaOS' IS
ini_Init,
ini_Read,
ini_Write,
ini_GroupPos,
ini_FindGroup,
ini_NewGroup,
ini_NewItem,
ini_Get,
ini_Set,
ini_GetStr,
ini_SetStr,
ini_GetInt,
ini_SetInt,
ini_GetArray,
ini_SetArray,
ini_Strip,
ini_SetErrorTexts,
ini_GetErrorMsg,
ini_Bracket,
ini_IsGroup,
ini_GroupLen,
ini_FindItem,
ini_RemGroup,
ini_RemItem,
ini_NextGroup,
ini_PrevGroup,
ini_GroupName,
ini_Str2Array,
ini_Array2Str,
ini_SplitItem
MODULE 'tools/file','*amigainibase','utility/tagitem'
PROC main() IS EMPTY
PROC ini_Init(ai:PTR TO amigaini,filename) HANDLE; DEF rv
ai.filename:=filename
ai.error:=INIE_Ok
ai.errortexts := [
'Ok',
'File does not exist',
'File length is NIL?',
'Unable to open File',
'Did not find Header',
'did not find Item',
'Memory Error',
'New Item was added',
'User command Error',
'Unknown Error',
'Header Already Exists',
'Invalid ErrorText Array',
0
]
IF ListLen(ai.errortexts)<>INIV_NumOfErrorTexts
ai.error:=INIE_ErrorTextNum
Raise(ai.error)
ENDIF
ai.list:=0
ai.length:=0
ai.groupstart:=0
ai.groupend:=0
ai.paramstr:= '='
ai.arraystr:= ','
ai.arraytype:= INIV_Type_Str
ai.casesense:= INIV_Case_Ignore
ai.autoadd:= INIV_AutoAdd_On
EXCEPT
rv:=ai.error
ENDPROC rv
PROC ini_Read(ai:PTR TO amigaini) HANDLE; DEF m,l,n,file
file:=ai.filename
n:=FileLength(file)
IF n=-1 THEN Raise(INIE_File)
IF n=0 THEN Raise(INIE_Length)
m,l:=readfile(file)
n:=countstrings(m,l)
IF ai.list THEN DisposeLink(ai.list)
ai.list:=stringsinfile(m,l,n)
ai.length:=n
ai.error:=INIE_Ok
EXCEPT
IF exception="OPEN" THEN exception:=INIE_Open
IF exception="MEM" THEN exception:=INIE_Mem
ai.error:=exception
ENDPROC ai.error
PROC ini_Write(ai:PTR TO amigaini) HANDLE; DEF h,c
IF (h:=Open(ai.filename,NEWFILE))=0 THEN Raise(INIE_File)
FOR c:=0 TO ai.length-1
Write(h,ai.list[c],StrLen(ai.list[c]))
Write(h,'\n',1)
ENDFOR
Close(h)
ai.error:=INIE_Ok
EXCEPT
IF exception="OPEN" THEN exception:=INIE_Open
ai.error:=exception
ENDPROC ai.error
PROC ini_GroupPos(ai:PTR TO amigaini,text); DEF c=0,s
s:=ini_Bracket(text)
WHILE c<ai.length
IF strcmp(ai.list[c],s,ai.casesense)
ai.error:=0
ai.groupstart:=c
RETURN ai.groupstart
ENDIF
c++
ENDWHILE
ai.error:=INIE_Header
ENDPROC -1
/* ---------------------------------------------------------*/
PROC ini_PrevGroup(ai:PTR TO amigaini)
DEF c
FOR c:=ai.groupstart-1 TO 0 STEP -1
IF ini_IsGroup(ai.list[c])
ini_FindGroup(ai,ai.list[c])
RETURN -1
ENDIF
ENDFOR
ENDPROC 0
PROC ini_NextGroup(ai:PTR TO amigaini)
DEF c
FOR c:=ai.groupend TO ai.length-1
IF ini_IsGroup(ai.list[c])
ini_FindGroup(ai,ai.list[c])
RETURN -1
ENDIF
ENDFOR
ENDPROC 0
PROC ini_GroupName(ai:PTR TO amigaini); DEF s,l
IF ini_IsGroup(ai.list[ai.groupstart])
l:=StrLen(ai.list[ai.groupstart])-2
s:=String(l)
MidStr(s,ai.list[ai.groupstart],1,l)
RETURN s
ENDIF
ENDPROC ''
PROC ini_FindGroup(ai:PTR TO amigaini,title); DEF c
IF StrLen(title)<1
ai.error:=INIE_Command
RETURN -1
ENDIF
IF ini_GroupPos(ai,title) = -1
ai.error:=INIE_Header
RETURN -1
ENDIF
c:= ai.groupstart+1
ai.groupend := (ai.length-1)
WHILE (c<ai.length) AND (ai.groupend = (ai.length-1)) DO IF ini_IsGroup(ai.list[c++]) THEN ai.groupend:=(c-2)
/*
IF StrLen(ai.list[ai.groupend])=0
REPEAT
ai.groupend--
UNTIL StrLen(ai.list[ai.groupend])>0
ENDIF
*/
ENDPROC ai.groupstart
PROC ini_FindItem(ai:PTR TO amigaini,title,whole); DEF c,s,e,st[256]:STRING
IF StrLen(title)<1
ai.error:=INIE_Command
RETURN
ENDIF
s:=(IF whole THEN 0 ELSE ai.groupstart +1)
e:=(IF whole THEN ai.length-1 ELSE ai.groupend)
FOR c:=s TO e
IF ini_SplitItem(ai,c,st,0) THEN
IF strcmp(st,title,ai.casesense) THEN RETURN c
ENDFOR
ENDPROC -1
PROC ini_NewGroup(ai:PTR TO amigaini,title); DEF c,l
IF StrLen(title)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
ini_FindGroup(ai,title)
IF ai.error=INIE_Ok
ai.error:=INIE_GotHeader
RETURN ai.error
ENDIF
c:=ini_Bracket(title)
IF ai.list
l:=List(ai.length)
ListCopy(l,ai.list)
DisposeLink(ai.list)
ENDIF
ai.list:=List(ai.length+1)
IF ai.length >0 THEN ListCopy(ai.list,l)
ListAdd(ai.list,[news(c)])
ai.length:=ListLen(ai.list)
SetList(ai.list,ai.length)
ai.groupstart:=ai.length-1
ai.groupend:=ai.length-1
ai.error:=INIE_Ok
ENDPROC ai.error
PROC ini_NewItem(ai:PTR TO amigaini,name,type,value)
DEF c,l:PTR TO LONG,t,s
IF type<INIV_Type_Blank
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
ENDIF
IF ai.list
l:=List(ai.length)
ListCopy(l,ai.list)
DisposeLink(ai.list)
ENDIF
IF type<INIV_Type_Blank
s:=String(StrLen(name)+1)
StringF(s,'\s\s',name,ai.paramstr)
ENDIF
ai.list:=List(ai.length+1)
FOR c:=0 TO ai.groupend DO ListAdd(ai.list,[l[c]])
IF type=INIV_Type_Info
ListAdd(ai.list,[value])
ELSE
ListAdd(ai.list,[IF type<>INIV_Type_Blank THEN s ELSE ''])
ENDIF
FOR c:=(ai.groupend+1) TO ai.length-1 DO ListAdd(ai.list,[l[c]])
ai.length:=ListLen(ai.list)
SetList(ai.list,ai.length)
ai.groupend:=ai.groupend+1
ai.error:=INIE_Ok
IF type<INIV_Type_Blank
t:=ai.autoadd
ai.autoadd:=INIV_AutoAdd_Off
ini_Set(ai,name,type,value)
ai.autoadd:=t
ENDIF
ENDPROC ai.error
PROC ini_RemItem(ai:PTR TO amigaini,name)
DEF c,l:PTR TO LONG
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
IF ai.groupstart<1
ai.error:=INIE_Header
RETURN ai.error
ENDIF
IF (c:=ini_FindItem(ai,name,0))=-1
ai.error:=INIE_Item
RETURN ai.error
ENDIF
l:=List(ai.length)
ListCopy(l,ai.list)
DisposeLink(ai.list)
ai.list:=List(ai.length-1)
ListCopy(ai.list,l,c)
FOR c:=(c+1) TO ai.length-1 DO ListAdd(ai.list,[l[c]])
ai.length:=ListLen(ai.list)
SetList(ai.list,ai.length)
ai.groupend:=ai.groupend-1
ai.error:=INIE_Ok
ENDPROC ai.error
PROC ini_RemGroup(ai:PTR TO amigaini,name)
DEF c,l:PTR TO LONG,ln
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
IF (c:=ini_FindGroup(ai,name))=-1
ai.error:=INIE_Header
RETURN ai.error
ENDIF
ln:=ini_GroupLen(ai)
l:=List(ai.length)
ListCopy(l,ai.list)
DisposeLink(ai.list)
ai.list:=List(ai.length-ln)
ListCopy(ai.list,l,ai.groupstart)
FOR c:=(ai.groupstart+ln) TO ai.length-1 DO ListAdd(ai.list,[l[c]])
ai.length:=ListLen(ai.list)
SetList(ai.list,ai.length)
ai.groupstart:=0
ai.groupend:=0
ai.error:=INIE_Ok
ENDPROC ai.error
PROC ini_Get(ai:PTR TO amigaini,name,typ,def)
SELECT typ
CASE INIV_Type_Str; RETURN ini_GetStr(ai,name,def)
CASE INIV_Type_Int; RETURN ini_GetInt(ai,name,def)
CASE INIV_Type_Array; RETURN ini_GetArray(ai,name,def)
ENDSELECT
ENDPROC INIV_Nop
PROC ini_Set(ai:PTR TO amigaini,name,typ,value);
SELECT typ
CASE INIV_Type_Str; ini_SetStr(ai,name,value)
CASE INIV_Type_Int; ini_SetInt(ai,name,value)
CASE INIV_Type_Array; ini_SetArray(ai,name,value)
ENDSELECT
ENDPROC
PROC ini_GetStr(ai:PTR TO amigaini,name,def:PTR TO CHAR)
DEF c,s1[256]:STRING,s2[512]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,s2)
IF strcmp(s1,name,ai.casesense)
ai.error:=INIE_Ok
RETURN news(s2)
ENDIF
ENDIF
ENDFOR
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Str,def)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC def
PROC ini_SetStr(ai:PTR TO amigaini,name,str)
DEF c,s[512]:STRING,realname,s1[256]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,0)
IF strcmp(s1,name,ai.casesense)
realname:=s1
ai.error:=INIE_Ok
StringF(s,'\s\s\s',realname,ai.paramstr,str)
ai.list[ai.groupstart+c]:=news(s)
RETURN
ENDIF
ENDIF
ENDFOR
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Str, str)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC
PROC ini_GetInt(ai:PTR TO amigaini,name,def);
DEF num,c,s1[256]:STRING,s2[512]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,s2)
IF strcmp(s1,name,ai.casesense)
ai.error:=INIE_Ok
num:=New(SIZEOF LONG)
num:=Val(s2)
RETURN num
ENDIF
ENDIF
ENDFOR
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Int,def)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC def
PROC ini_SetInt(ai:PTR TO amigaini,name,num)
DEF c,s[256]:STRING,realname,s1[256]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,0)
IF strcmp(s1,name,ai.casesense)
realname:=s1
ai.error:=INIE_Ok
StringF(s,'\s\s\d',realname,ai.paramstr,num)
->DisposeLink(ai.list[ai.groupstart+c])
ai.list[ai.groupstart+c]:=news(s)
RETURN
ENDIF
ENDIF
ENDFOR
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Int,num)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC
PROC ini_GetArray(ai:PTR TO amigaini,name,def:PTR TO LONG)
DEF ar:PTR TO LONG,c,s1[256]:STRING,s2[512]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN ai.error
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,s2)
IF strcmp(s1,name,ai.casesense)
ai.error:=0
ar:=ini_Str2Array(s2,ai.arraystr,ai.arraytype)
RETURN ar
ENDIF
ENDIF
ENDFOR
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Array, def)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC def
PROC ini_SetArray(ai:PTR TO amigaini,name,ar:PTR TO LONG)
DEF c,realname,s1[256]:STRING
IF StrLen(name)<1
ai.error:=INIE_Command
RETURN
ENDIF
FOR c:=1 TO ini_GroupLen(ai)-1
IF ini_SplitItem(ai,ai.groupstart+c,s1,0)
IF strcmp(s1,name,ai.casesense)
realname:=getrealname(name,ai,c)
ai.error:=0
->DisposeLink(ai.list[ai.groupstart+c])
ai.list[ai.groupstart+c]:=ini_Array2Str(ar, name, ai.paramstr, ai.arraystr, ai.arraytype)
RETURN
ENDIF
ENDIF
ENDFOR
-> else not found
ai.error:=INIE_Item
IF ai.autoadd
ini_NewItem(ai,name,INIV_Type_Array,ar)
IF ai.error=INIE_Ok THEN ai.error:=INIE_Added
ENDIF
ENDPROC
PROC ini_Str2Array(st,ch,typ); DEF a,c=0,n=0,p=0,t,s[512]:STRING
t:=news(st)
REPEAT
c:=InStr(t,ch,c)
c:=(c+StrLen(ch))
n++
UNTIL c<StrLen(ch)
a:=List(n)
FOR c:=0 TO n-1
p:=InStr(t,ch)
IF p<>0 THEN StrCopy(s,t,p) ELSE StrCopy(s,'')
ListAdd(a,[IF typ=INIV_Type_Str THEN news(s) ELSE Val(s)])
MidStr(t,t,p+StrLen(ch))
ENDFOR
ENDPROC a
PROC ini_Array2Str(a:PTR TO LONG,n,ps,as,typ); DEF c,s
s:=String(512)
StringF(s,'\s\s',n,ps)
FOR c:=0 TO ListLen(a)-1
StringF(s,IF typ=INIV_Type_Str THEN '\s\s\s' ELSE '\s\d\s', s,a[c],as)
ENDFOR
SetStr(s,StrLen(s)-1)
ENDPROC s
PROC ini_Strip(ai:PTR TO amigaini); DEF c,a=0,l
-> get amount of blank lines
FOR c:=0 TO ai.length-1 DO IF StrLen(ai.list[c])=0 THEN a++
-> no blanks so return
IF a=0 THEN RETURN
-> Copy list
l:=List(ai.length)
ListCopy(l,ai.list)
-> clear ai.list
DisposeLink(ai.list)
->renew ai.list with new size
ai.list:=List(ai.length-a)
-> copy without blanks
FOR c:=0 TO ai.length-1 DO IF StrLen(ListItem(l,c))<>0 THEN ListAdd(ai.list,[ListItem(l,c)])
-> Set new length
ai.length:=ai.length-a
ENDPROC
PROC ini_SetErrorTexts(ai:PTR TO amigaini,a:PTR TO LONG)
IF ListLen(a)<>INIV_NumOfErrorTexts
ai.error:=INIE_Command
RETURN
ENDIF
IF ListLen(ai.errortexts)<1 THEN ai.errortexts:=List(INIV_NumOfErrorTexts)
ListCopy(ai.errortexts,a,INIV_NumOfErrorTexts)
SetList(ai.errortexts,INIV_NumOfErrorTexts)
ENDPROC
PROC ini_GetErrorMsg(ai:PTR TO amigaini) IS ai.errortexts[ai.error]
PROC ini_Bracket(t); DEF s,has=0
has:=ini_IsGroup(t)
s:=String(StrLen(t)+(IF has THEN 0 ELSE 2))
StringF(s,IF has THEN '\s' ELSE '[\s]',t)
ENDPROC s
PROC strcmp(s1,s2,case=0)
DEF u1,u2
IF case=INIV_Case_Sense THEN RETURN StrCmp(s1,s2)
u1:=String(StrLen(s1))
u2:=String(StrLen(s2))
StrCopy(u1,s1)
StrCopy(u2,s2)
UpperStr(u1)
UpperStr(u2)
ENDPROC StrCmp(u1,u2)
/*
PROC instr(s1,s2,case=0)
DEF u1,u2
IF case=INIV_Case_Sense THEN RETURN InStr(s1,s2)
u1:=String(StrLen(s1))
u2:=String(StrLen(s2))
StrCopy(u1,s1)
StrCopy(u2,s2)
UpperStr(u1)
UpperStr(u2)
ENDPROC InStr(u1,u2)
*/
PROC news(os); DEF ns; ns:=String(StrLen(os));StrCopy(ns,os); ENDPROC ns
PROC getrealname(name,ai:PTR TO amigaini,item); DEF rn; rn:=String(StrLen(name)); StrCopy(rn,ai.list[ai.groupstart+item],StrMax(rn)); ENDPROC rn
PROC ini_IsGroup(t) IS (t[0]="[") AND (t[StrLen(t)-1]="]")
PROC ini_GroupLen(ai:PTR TO amigaini) IS (ai.groupend-ai.groupstart)+1
PROC ini_SplitItem(ai:PTR TO amigaini,pos,s1:PTR TO CHAR,s2:PTR TO CHAR)
DEF p
p:=InStr(ai.list[pos],ai.paramstr)
IF p=-1 THEN RETURN 0
IF s1 THEN StrCopy(s1,ai.list[pos],p)
IF s2 THEN MidStr(s2,ai.list[pos],p+1)
ENDPROC 1